package com.cy.store.service.impl;

import com.cy.store.entity.Cart;
import com.cy.store.entity.Product;
import com.cy.store.mapper.CartMapper;
import com.cy.store.service.ICartService;
import com.cy.store.service.IProductService;
import com.cy.store.service.ex.AccessDeniedException;
import com.cy.store.service.ex.CartNotFoundException;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UpdateException;
import com.cy.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class ICartServiceImpl implements ICartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private IProductService productService;
    @Override
    public void addToCart(Integer uid, Integer pid, Integer amount, String username) {
        //根据pid和uid查询购物车中商品的数据
        Cart res = cartMapper.findByUidAndPid(uid, pid);
        Date date = new Date();
        //判断res是否存在
        if (res==null){
            //res为空则说明购物车中没有当前商品数据、需要进行插入操作
            //根据pid查询商品信息
            Product product = productService.findById(pid);
            //往cart中添加数据
            Cart cart = new Cart();
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setPrice(product.getPrice());
            cart.setNum(amount);
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);
            //进行插入操作
            Integer rows = cartMapper.insert(cart);
            if (rows!=1){
                throw new InsertException("添加购物车出现异常");
            }
        }else {
            //res不为空、则说明购物车中存在商品信息
            //只需要对商品数量进行修改
            Integer cid = res.getCid();
            Integer num = res.getNum()+amount;

            Integer rows = cartMapper.updateNumByCid(cid, num, username, date);
            if(rows!=1){
                throw new UpdateException("修改购物车出现异常");
            }
        }

    }

    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return cartMapper.findVOByUid(uid);
    }

    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)) {
            // 是：抛出AccessDeniedException
            throw new AccessDeniedException("非法访问");
        }
        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num = result.getNum() + 1;

        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = cartMapper.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }

        // 返回新的数量
        return num;


    }

    @Override
    public Integer subNum(Integer cid, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)) {
            // 是：抛出AccessDeniedException
            throw new AccessDeniedException("非法访问");
        }
        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        if (result.getNum()==1){
            cartMapper.deleteByCid(cid);
            return null;
        }
        // 根据查询结果中的原数量-1得到新的数量num
        Integer num = result.getNum() - 1;

        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = cartMapper.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }

        // 返回新的数量
        return num;

    }

    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> list = cartMapper.findVOByCids(cids);
        /**
         for (CartVO cart : list) {
         if (!cart.getUid().equals(uid)) {
         list.remove(cart);
         }
         }
         */
        //检测集合中的数据是否属于当前用户的uid，不是则移除掉
        Iterator<CartVO> it = list.iterator();
        while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }
        return list;
    }

    @Override
    public void removeByCid(Integer cid, Integer uid) {
        //首先根据cid查询数据库
        Cart result = cartMapper.findByCid(cid);
        if (result == null){
            //没有查到此cid  抛出异常
            throw new CartNotFoundException("购物车中没有当前数据");
        }
        if (!result.getUid().equals(uid)){
            //当根据cid查询到的uid与当前登录的不一致时
            throw new AccessDeniedException("非法访问");
        }
        //根据cid删除
        Integer rows = cartMapper.deleteByCid(cid);
        if (rows!=1){
            throw new UpdateException("删除商品时出现未知错误");
        }
    }

    @Override
    public Cart selectByCid(Integer cid) {
        Cart cart = cartMapper.findByCid(cid);
        return cart;
    }

    @Override
    public void removeByCids(Integer[] cids) {
        /*//首先根据uid查询cid数据
        List<CartVO> result = cartMapper.findVOByUid(uid);
        if (result==null){
            //如果查询出来没有数据
            throw new CartNotFoundException("没有查到购物车中的数据");
        }
        CartVO cartVO = result.get(0);
        if (!cartVO.getUid().equals(uid)){
            //查询出的uid与当前uid不符合
            throw new AccessDeniedException("非法数据访问");
        }*/
        //查询到有数据，进行删除购物车功能
        Integer rows = cartMapper.deletebyCids(cids);
        if (rows<1){
            throw new UpdateException("删除购物车时出现未知异常");
        }
    }
}
